<?php

namespace Wechat;

/**
 * 微信公众号配置
 */
class Config
{
    // 填写高级调用功能的app
    public static $appid = '';
    // 填写高级调用功能的密钥
    public static $appsecret = '';
    // 填写你设定的key
    public static $token = '';
    // 填写加密用的EncodingAESKey
    public static $encodingaeskey = '';
    // 命令白名单 ['角色' => ['openid1', 'openid2']]
    public static $cmdWhiteList = [
        'admin' => ['yourOpenId'],
    ];
    // 命令黑名单 ['角色' => ['openid1', 'openid2']]
    public static $cmdBlackList = [];
    // title: 标题
    // value: 命令需要的值
    // description: 描述
    // short: 缩写 (全小写)
    // role: 命令角色
    public static $cmd = [ // 所有命令
        // user角色通用命令
        'text' => [ // 普通文本
            'title' => '普通文本信息',
            'value' => '文本信息',
            'description' => '初始默认命令，可忽略命令关键字，直接回复文本信息',
            'short' => [],
            'role' => 'user'
        ],
        'taobao' => [
            'title' => '淘宝抵扣券',
            'value' => '商品名称',
            'description' => '输入商品名称，可查找最大面额抵扣券，可直接用于商品抵扣',
            'short' => ['tb'],
            'role' => 'user'
        ],
        'instagram' => [ // 通过ins链接获得图片
            'title' => 'ins图片保存 (v2.0) <a href="https://mp.weixin.qq.com/s/rxNJhOyZTpdddILUs9EIfA">帮助</a>',
            'value' => 'ins图片分享链接',
            'description' => '复制Instagram图片分享链接可返回图片，长按保存 (需VPN)',
            'short' => ['ins', 'ig'],
            'role' => 'user'
        ],
        'douyin' => [ // 下载抖音无水印
            'title' => '抖音去水印 (v2.0) <a href="https://mp.weixin.qq.com/s/rpL1oflUxLQsY-ccuzcv0w">帮助</a>',
            'value' => '视频分享链接',
            'description' => '复制抖音分享链接发到公众号，可下载无水印高清原视频',
            'short' => ['dy'],
            'role' => 'user'
        ],
        'wangyiyun' => [ // 下载网易云音乐
            'title' => '网易云音乐 (v2.0) <a href="https://mp.weixin.qq.com/s/KRhTPNqdR-V1zwFAuOOkUA">帮助</a>',
            'value' => '音乐分享链接',
            'description' => '复制网易云音乐分享链接发到公众号，可下载原音频文件',
            'short' => ['wyy'],
            'role' => 'user'
        ],
        'help' => [ // 帮助
            'title' => '帮助',
            'value' => '',
            'description' => '可查看命令的<a href="https://mp.weixin.qq.com/mp/homepage?__biz=MzU2Njc4NjI0NA==&hid=1&sn=8f907ed9a66c40c29fcb963a77a95e79">基本用法</a>',
            'short' => ['h', '帮助'],
            'role' => 'user'
        ],
        'kefu' => [ // 客服
            'title' => '客服',
            'value' => '',
            'description' => '添加客服微信，备注ImgHelper',
            'short' => ['kf', '客服'],
            'role' => 'user'
        ],
        // admin角色管理命令
        'openid' => [ // 获取openid
            'title' => '获取openid',
            'value' => '',
            'description' => '回复命令或缩写可获得自己的openid',
            'short' => ['id'],
            'role' => 'admin'
        ]
    ];

    /**
     * 获取cmd的key
     *
     * @param [type] key或者缩写
     * @return void
     */
    public static function cmdKey($key)
    {
        if (isset(self::$cmd[$key])) {
            return $key;
        }
        foreach (self::$cmd as $k => $v) {
            if ((is_array($v['short']) && in_array($key, $v['short'])) || $key == $v['short']) {
                return $k;
            }
        }
        return '';
    }

    /**
     * 指定允许显示的角色命令
     *
     * @param string $allowRole
     * @return void
     */
    public static function cmdAllow($allowRole = 'user')
    {
        $result = [];
        if (is_string($allowRole)) {
            $allowRole = explode(',', $allowRole);
        }
        if (is_array($allowRole) && $allowRole) {
            foreach (self::$cmd as $k => $v) {
                if (in_array($v['role'], $allowRole)) {
                    $result[$k] = $v;
                }
            }
        }
        return $result;
    }

    /**
     * 命令鉴权
     *
     * @param [type] 角色
     * @param [type] openid
     * @return void
     */
    public static function cmdAuth($role, $openid)
    {
        // 黑名单鉴权
        if (isset(self::$cmdBlackList[$role]) && in_array($openid, self::$cmdBlackList[$role])) {
            return false; // 存在黑名单则无权访问
        }
        // 白名单鉴权
        if (isset(self::$cmdWhiteList[$role])) {
            if (!in_array($openid, self::$cmdWhiteList[$role])) {
                return false; // 不存在白名单则无权访问
            }
        }
        return true; // 没被加入黑名单并且存在白名单
    }

    /**
     * 执行命令
     *
     * @param [type] $val
     * @param string $key
     * @param [type] $openid
     * @param string $role
     * @return void
     */
    public static function cmdAction($val, $key = 'text', $openid, $role = 'user')
    {
        // 分发命令操作
        $cmdClass = '\Cmd\\' . $role . '\\' . $key;
        if (!class_exists($cmdClass)) { // 不存在命令时 默认text
            $val = $key . $val;
            $key = 'text';
            $cmdClass = '\Cmd\user\text';
        }
        // 命令鉴权
        if (!self::cmdAuth($role, $openid)) {
            return '无权访问【' . $key . '】命令';
        }
        return (new $cmdClass)->$key($val, $openid);
    }
}
